package com.sishu.njrtsdms.service;


import com.sishu.njrtsdms.domain.core.PageInfo;
import com.sishu.njrtsdms.domain.dto.TcpPointAssignRecordDTO;
import com.sishu.njrtsdms.domain.dto.TeachConPrjAuditDTO;
import com.sishu.njrtsdms.domain.dto.TeachConPrjDTO;
import com.sishu.njrtsdms.domain.vo.*;
import jakarta.servlet.http.HttpServletResponse;
import org.jooq.types.ULong;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

public interface TeachConPrjService {

    /**
     * 教学重点建设项目信息分页条件查询
     *
     * @param teachConPrjDTO 重点建设项目信息查询条件
     * @return 建设项目信息分页信息
     */
    PageInfo<TeachConPrjVO> page(TeachConPrjDTO teachConPrjDTO);


    /**
     * 教学重点建设项目信息id查询
     *
     * @param tcpId 重点建设项目id
     * @return 建设项目信息分页信息
     */
    TeachConPrjVO queryOneTeachConPrj(Long tcpId);


    /**
     * 教学重点建设项目信息总数精确查询
     *
     * @param teachConPrjDTO 查询条件
     * @return 查询总数
     */
    Long totalCount(TeachConPrjDTO teachConPrjDTO);

    /**
     * 创建项目
     *
     * @param teachConPrjDTO 创建的项目信息
     */
    @Transactional
    void create(TeachConPrjDTO teachConPrjDTO);

    /**
     * 修改项目,只能修改待审报或退回状态的
     *
     * @param tcpId          项目id
     * @param teachConPrjDTO 修改的项目信息
     */
    @Transactional
    void updateProject(ULong tcpId, TeachConPrjDTO teachConPrjDTO);

    /**
     * 删除项目,对于未提交状态的项目,允许物理删除,已提交的只能逻辑删除
     *
     * @param tcpId 项目id
     */
    @Transactional
    void deleteProject(ULong tcpId);

    /**
     * 项目申报,将未提交或退回的项目转为部门审核中状态,并更新申报时间和申报人信息
     *
     * @param tcpId 项目id
     */
    @Transactional
    void declare(ULong tcpId);

    /**
     * 上传项目申报文件
     *
     * @param tcpId 项目id
     * @param files 文件
     */
    void uploadProjectFiles(ULong tcpId, List<MultipartFile> files);

    /**
     * 查询所有项目相关的佐证文件信息
     */
    List<SysFileVO> listProjectProofFiles(ULong tcpId);


    /**
     * 项目审核
     *
     * @param tcpId               重点建设项目id
     * @param teachConPrjAuditDTO 重点建设项目审核内容
     */
    @Transactional
    void auditProject(ULong tcpId, TeachConPrjAuditDTO teachConPrjAuditDTO);

    /**
     * 申报项目分配绩点
     *
     * @param tcpId                    重点建设项目id
     * @param tcpPointAssignRecordDTOS 项目绩点分配信息
     */
    @Transactional
    void assignPoint(ULong tcpId, List<TcpPointAssignRecordDTO> tcpPointAssignRecordDTOS);

    /**
     * 查询项目绩点分配情况
     *
     * @param tcpId 重点建设项目id
     * @return 重点建设项目绩点分配详情
     */
    List<TcpPointAssignRecordVO> listTcpPointAssignRecords(ULong tcpId);

    /**
     * 查询对应项目的所有审核记录
     * 并以审核等级的字典数据id分组
     *
     * @param tcpId 项目id
     */
    Map<ULong, List<TcpAuditRecordVO>> listTcpAuditRecordGroupVOs(ULong tcpId);

    /**
     * 查询制定项目所有负责人信息
     *
     * @param tcpId 项目id
     * @return 所有相关负责人信息
     */
    List<UserSimpleVO> listProjectLeaders(ULong tcpId);

    /**
     * 生成导出重点建设项目根据学院和年度分类后的Excel表格
     * 以项目模板分组,每一种模板一个表格
     * 只导出通过审核的项目
     *
     * @param collegeId 学院id
     * @param tcpDbycId 年度归属配置信息id
     */
    void exportCollegeTeachConPrj(ULong collegeId,
                                  ULong tcpDbycId,
                                  HttpServletResponse response);

    /**
     * 绩点汇总统计导出
     *
     * @param tcpDbycId 归属年度信息id
     */
    List<PointExcelVO> getPointExcelVOList(ULong tcpDbycId);
}